package com.smart.community.region.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.region.dto.BatchCreateFeeStandardDTO;
import com.smart.community.region.entity.ShopFeeStandard;

import java.time.LocalDate;
import java.util.List;

/**
 * 店铺费用标准Service接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
public interface IShopFeeStandardService extends IService<ShopFeeStandard> {
    
    /**
     * 分页查询费用标准
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 分页结果
     * @throws Exception 异常
     */
    IPage<ShopFeeStandard> getFeeStandardPage(Page<ShopFeeStandard> page, Long shopId, String feeType) throws Exception;
    
    /**
     * 根据店铺ID查询费用标准列表
     * 
     * @param shopId 店铺ID
     * @return 费用标准列表
     * @throws Exception 异常
     */
    List<ShopFeeStandard> getFeeStandardsByShopId(Long shopId) throws Exception;
    
    /**
     * 根据费用类型查询费用标准列表
     * 
     * @param feeType 费用类型
     * @return 费用标准列表
     * @throws Exception 异常
     */
    List<ShopFeeStandard> getFeeStandardsByType(String feeType) throws Exception;
    
    /**
     * 根据店铺ID和费用类型查询当前有效的费用标准
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param currentDate 当前日期
     * @return 费用标准
     * @throws Exception 异常
     */
    ShopFeeStandard getCurrentFeeStandard(Long shopId, String feeType, LocalDate currentDate) throws Exception;
    
    /**
     * 根据店铺ID和费用类型查询费用标准列表
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 费用标准列表
     * @throws Exception 异常
     */
    List<ShopFeeStandard> getFeeStandardsByShopIdAndType(Long shopId, String feeType) throws Exception;
    
    /**
     * 根据生效日期查询费用标准列表
     * 
     * @param effectiveDate 生效日期
     * @return 费用标准列表
     * @throws Exception 异常
     */
    List<ShopFeeStandard> getFeeStandardsByEffectiveDate(LocalDate effectiveDate) throws Exception;
    
    /**
     * 根据状态查询费用标准列表
     * 
     * @param status 状态
     * @return 费用标准列表
     * @throws Exception 异常
     */
    List<ShopFeeStandard> getFeeStandardsByStatus(Integer status) throws Exception;
    
    /**
     * 创建费用标准
     * 
     * @param feeStandard 费用标准
     * @return 标准ID
     * @throws Exception 异常
     */
    Long createFeeStandard(ShopFeeStandard feeStandard) throws Exception;
    
    /**
     * 更新费用标准
     * 
     * @param feeStandard 费用标准
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean updateFeeStandard(ShopFeeStandard feeStandard) throws Exception;
    
    /**
     * 删除费用标准
     * 
     * @param id 标准ID
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean deleteFeeStandard(Long id) throws Exception;
    
    /**
     * 统计费用标准数量
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 费用标准数量
     * @throws Exception 异常
     */
    Integer countFeeStandards(Long shopId, String feeType) throws Exception;
    
    /**
     * 检查费用标准是否存在冲突
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param effectiveDate 生效日期
     * @param excludeId 排除的标准ID
     * @return 是否存在冲突
     * @throws Exception 异常
     */
    Boolean existsConflict(Long shopId, String feeType, LocalDate effectiveDate, Long excludeId) throws Exception;
    
    /**
     * 批量新增费用标准
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Service层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param batchCreateDTO 批量新增费用标准DTO
     * @return 创建的费用标准ID列表
     * @throws Exception 异常
     */
    List<Long> batchCreateFeeStandard(BatchCreateFeeStandardDTO batchCreateDTO) throws Exception;
    
    /**
     * 分页查询费用标准
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Service层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param status 状态
     * @param minFeeAmount 费用标准金额范围-最小值
     * @param maxFeeAmount 费用标准金额范围-最大值
     * @param effectiveDateStart 生效日期开始
     * @param effectiveDateEnd 生效日期结束
     * @param expiryDateStart 过期日期开始
     * @param expiryDateEnd 过期日期结束
     * @param createTimeStart 创建时间开始
     * @param createTimeEnd 创建时间结束
     * @param keyword 关键字搜索
     * @return 分页结果
     * @throws Exception 异常
     */
    Object getFeeStandardPage(Integer current, Integer size, Long shopId, String feeType, Integer status,
                             java.math.BigDecimal minFeeAmount, java.math.BigDecimal maxFeeAmount,
                             java.time.LocalDate effectiveDateStart, java.time.LocalDate effectiveDateEnd,
                             java.time.LocalDate expiryDateStart, java.time.LocalDate expiryDateEnd,
                             java.time.LocalDateTime createTimeStart, java.time.LocalDateTime createTimeEnd,
                             String keyword) throws Exception;
    
    /**
     * 获取费用标准详情
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Service层规范
     * 
     * @param id 费用标准ID
     * @return 费用标准详情
     * @throws Exception 异常
     */
    Object getFeeStandardDetail(Long id) throws Exception;
    
    /**
     * 更新费用标准
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Service层规范
     * 
     * @param id 费用标准ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean updateFeeStandard(Long id, BatchCreateFeeStandardDTO updateDTO) throws Exception;
    
    /**
     * 批量删除费用标准
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Service层规范
     * 
     * @param ids 费用标准ID列表
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean batchDeleteFeeStandard(List<Long> ids) throws Exception;
}
